

    struct TTuple0
    {
    };

    template<typename T, int K> struct TTupleGetType;

    

    template<typename A0>
    struct TTuple1
    {
A0 iA0;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    

    };

    template<typename A0>
    struct TTupleGetType<TTuple1<A0>, 0> { typedef A0 type; };
    

    template<typename A0, typename A1>
    struct TTuple2
    {
A0 iA0;
  A1 iA1;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    

    };

    template<typename A0, typename A1>
    struct TTupleGetType<TTuple2<A0, A1>, 0> { typedef A0 type; };
    template<typename A0, typename A1>
    struct TTupleGetType<TTuple2<A0, A1>, 1> { typedef A1 type; };
    

    template<typename A0, typename A1, typename A2>
    struct TTuple3
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    

    };

    template<typename A0, typename A1, typename A2>
    struct TTupleGetType<TTuple3<A0, A1, A2>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2>
    struct TTupleGetType<TTuple3<A0, A1, A2>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2>
    struct TTupleGetType<TTuple3<A0, A1, A2>, 2> { typedef A2 type; };
    

    template<typename A0, typename A1, typename A2, typename A3>
    struct TTuple4
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3>
    struct TTupleGetType<TTuple4<A0, A1, A2, A3>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3>
    struct TTupleGetType<TTuple4<A0, A1, A2, A3>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3>
    struct TTupleGetType<TTuple4<A0, A1, A2, A3>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3>
    struct TTupleGetType<TTuple4<A0, A1, A2, A3>, 3> { typedef A3 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    struct TTuple5
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    struct TTupleGetType<TTuple5<A0, A1, A2, A3, A4>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    struct TTupleGetType<TTuple5<A0, A1, A2, A3, A4>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    struct TTupleGetType<TTuple5<A0, A1, A2, A3, A4>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    struct TTupleGetType<TTuple5<A0, A1, A2, A3, A4>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    struct TTupleGetType<TTuple5<A0, A1, A2, A3, A4>, 4> { typedef A4 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TTuple6
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TTupleGetType<TTuple6<A0, A1, A2, A3, A4, A5>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TTupleGetType<TTuple6<A0, A1, A2, A3, A4, A5>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TTupleGetType<TTuple6<A0, A1, A2, A3, A4, A5>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TTupleGetType<TTuple6<A0, A1, A2, A3, A4, A5>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TTupleGetType<TTuple6<A0, A1, A2, A3, A4, A5>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TTupleGetType<TTuple6<A0, A1, A2, A3, A4, A5>, 5> { typedef A5 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTuple7
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTupleGetType<TTuple7<A0, A1, A2, A3, A4, A5, A6>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTupleGetType<TTuple7<A0, A1, A2, A3, A4, A5, A6>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTupleGetType<TTuple7<A0, A1, A2, A3, A4, A5, A6>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTupleGetType<TTuple7<A0, A1, A2, A3, A4, A5, A6>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTupleGetType<TTuple7<A0, A1, A2, A3, A4, A5, A6>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTupleGetType<TTuple7<A0, A1, A2, A3, A4, A5, A6>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TTupleGetType<TTuple7<A0, A1, A2, A3, A4, A5, A6>, 6> { typedef A6 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTuple8
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TTupleGetType<TTuple8<A0, A1, A2, A3, A4, A5, A6, A7>, 7> { typedef A7 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTuple9
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A8 iA8;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    A8 Get(const TPlaceholder<8>&) { return iA8; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 7> { typedef A7 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TTupleGetType<TTuple9<A0, A1, A2, A3, A4, A5, A6, A7, A8>, 8> { typedef A8 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTuple10
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A8 iA8;
  A9 iA9;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    A8 Get(const TPlaceholder<8>&) { return iA8; }
    A9 Get(const TPlaceholder<9>&) { return iA9; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 7> { typedef A7 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 8> { typedef A8 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TTupleGetType<TTuple10<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9>, 9> { typedef A9 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTuple11
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A8 iA8;
  A9 iA9;
  A10 iA10;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    A8 Get(const TPlaceholder<8>&) { return iA8; }
    A9 Get(const TPlaceholder<9>&) { return iA9; }
    A10 Get(const TPlaceholder<10>&) { return iA10; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 7> { typedef A7 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 8> { typedef A8 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 9> { typedef A9 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TTupleGetType<TTuple11<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, 10> { typedef A10 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTuple12
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A8 iA8;
  A9 iA9;
  A10 iA10;
  A11 iA11;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    A8 Get(const TPlaceholder<8>&) { return iA8; }
    A9 Get(const TPlaceholder<9>&) { return iA9; }
    A10 Get(const TPlaceholder<10>&) { return iA10; }
    A11 Get(const TPlaceholder<11>&) { return iA11; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 7> { typedef A7 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 8> { typedef A8 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 9> { typedef A9 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 10> { typedef A10 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TTupleGetType<TTuple12<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, 11> { typedef A11 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTuple13
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A8 iA8;
  A9 iA9;
  A10 iA10;
  A11 iA11;
  A12 iA12;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    A8 Get(const TPlaceholder<8>&) { return iA8; }
    A9 Get(const TPlaceholder<9>&) { return iA9; }
    A10 Get(const TPlaceholder<10>&) { return iA10; }
    A11 Get(const TPlaceholder<11>&) { return iA11; }
    A12 Get(const TPlaceholder<12>&) { return iA12; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 7> { typedef A7 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 8> { typedef A8 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 9> { typedef A9 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 10> { typedef A10 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 11> { typedef A11 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TTupleGetType<TTuple13<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, 12> { typedef A12 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTuple14
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A8 iA8;
  A9 iA9;
  A10 iA10;
  A11 iA11;
  A12 iA12;
  A13 iA13;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    A8 Get(const TPlaceholder<8>&) { return iA8; }
    A9 Get(const TPlaceholder<9>&) { return iA9; }
    A10 Get(const TPlaceholder<10>&) { return iA10; }
    A11 Get(const TPlaceholder<11>&) { return iA11; }
    A12 Get(const TPlaceholder<12>&) { return iA12; }
    A13 Get(const TPlaceholder<13>&) { return iA13; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 7> { typedef A7 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 8> { typedef A8 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 9> { typedef A9 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 10> { typedef A10 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 11> { typedef A11 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 12> { typedef A12 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TTupleGetType<TTuple14<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, 13> { typedef A13 type; };
    

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTuple15
    {
A0 iA0;
  A1 iA1;
  A2 iA2;
  A3 iA3;
  A4 iA4;
  A5 iA5;
  A6 iA6;
  A7 iA7;
  A8 iA8;
  A9 iA9;
  A10 iA10;
  A11 iA11;
  A12 iA12;
  A13 iA13;
  A14 iA14;
  A0 Get(const TPlaceholder<0>&) { return iA0; }
    A1 Get(const TPlaceholder<1>&) { return iA1; }
    A2 Get(const TPlaceholder<2>&) { return iA2; }
    A3 Get(const TPlaceholder<3>&) { return iA3; }
    A4 Get(const TPlaceholder<4>&) { return iA4; }
    A5 Get(const TPlaceholder<5>&) { return iA5; }
    A6 Get(const TPlaceholder<6>&) { return iA6; }
    A7 Get(const TPlaceholder<7>&) { return iA7; }
    A8 Get(const TPlaceholder<8>&) { return iA8; }
    A9 Get(const TPlaceholder<9>&) { return iA9; }
    A10 Get(const TPlaceholder<10>&) { return iA10; }
    A11 Get(const TPlaceholder<11>&) { return iA11; }
    A12 Get(const TPlaceholder<12>&) { return iA12; }
    A13 Get(const TPlaceholder<13>&) { return iA13; }
    A14 Get(const TPlaceholder<14>&) { return iA14; }
    

    };

    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 0> { typedef A0 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 1> { typedef A1 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 2> { typedef A2 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 3> { typedef A3 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 4> { typedef A4 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 5> { typedef A5 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 6> { typedef A6 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 7> { typedef A7 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 8> { typedef A8 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 9> { typedef A9 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 10> { typedef A10 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 11> { typedef A11 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 12> { typedef A12 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 13> { typedef A13 type; };
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TTupleGetType<TTuple15<A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, 14> { typedef A14 type; };
    
    template<typename A0>
    struct TList1
    {
      typedef TListCons<A0,  TList0::type> type;
    };
  
    template<typename A0, typename A1>
    struct TList2
    {
      typedef TListCons<A0, typename TList1<A1>::type> type;
    };
  
    template<typename A0, typename A1, typename A2>
    struct TList3
    {
      typedef TListCons<A0, typename TList2<A1, A2>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3>
    struct TList4
    {
      typedef TListCons<A0, typename TList3<A1, A2, A3>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    struct TList5
    {
      typedef TListCons<A0, typename TList4<A1, A2, A3, A4>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TList6
    {
      typedef TListCons<A0, typename TList5<A1, A2, A3, A4, A5>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TList7
    {
      typedef TListCons<A0, typename TList6<A1, A2, A3, A4, A5, A6>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TList8
    {
      typedef TListCons<A0, typename TList7<A1, A2, A3, A4, A5, A6, A7>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TList9
    {
      typedef TListCons<A0, typename TList8<A1, A2, A3, A4, A5, A6, A7, A8>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TList10
    {
      typedef TListCons<A0, typename TList9<A1, A2, A3, A4, A5, A6, A7, A8, A9>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TList11
    {
      typedef TListCons<A0, typename TList10<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TList12
    {
      typedef TListCons<A0, typename TList11<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TList13
    {
      typedef TListCons<A0, typename TList12<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TList14
    {
      typedef TListCons<A0, typename TList13<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>::type> type;
    };
  
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TList15
    {
      typedef TListCons<A0, typename TList14<A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>::type> type;
    };
  

      template<int N, typename RetType, typename T, typename BindList>
    struct TBinderBase
    {

    RetType operator()()
    {
    TTuple0 placeholderListTuple;
    return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }

      
    
    template<typename A0>
    RetType operator()(A0& aA0)
	    {
        TTuple1<A0&> placeholderListTuple = {aA0};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1>
    RetType operator()(A0& aA0, A1& aA1)
	    {
        TTuple2<A0&, A1&> placeholderListTuple = {aA0, aA1};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2)
	    {
        TTuple3<A0&, A1&, A2&> placeholderListTuple = {aA0, aA1, aA2};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3)
	    {
        TTuple4<A0&, A1&, A2&, A3&> placeholderListTuple = {aA0, aA1, aA2, aA3};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4)
	    {
        TTuple5<A0&, A1&, A2&, A3&, A4&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5)
	    {
        TTuple6<A0&, A1&, A2&, A3&, A4&, A5&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6)
	    {
        TTuple7<A0&, A1&, A2&, A3&, A4&, A5&, A6&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7)
	    {
        TTuple8<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7, A8& aA8)
	    {
        TTuple9<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7, A8& aA8, A9& aA9)
	    {
        TTuple10<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7, A8& aA8, A9& aA9, A10& aA10)
	    {
        TTuple11<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&, A10&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7, A8& aA8, A9& aA9, A10& aA10, A11& aA11)
	    {
        TTuple12<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&, A10&, A11&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7, A8& aA8, A9& aA9, A10& aA10, A11& aA11, A12& aA12)
	    {
        TTuple13<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&, A10&, A11&, A12&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7, A8& aA8, A9& aA9, A10& aA10, A11& aA11, A12& aA12, A13& aA13)
	    {
        TTuple14<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&, A10&, A11&, A12&, A13&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12, aA13};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    
    template<typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    RetType operator()(A0& aA0, A1& aA1, A2& aA2, A3& aA3, A4& aA4, A5& aA5, A6& aA6, A7& aA7, A8& aA8, A9& aA9, A10& aA10, A11& aA11, A12& aA12, A13& aA13, A14& aA14)
	    {
        TTuple15<A0&, A1&, A2&, A3&, A4&, A5&, A6&, A7&, A8&, A9&, A10&, A11&, A12&, A13&, A14&> placeholderListTuple = {aA0, aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12, aA13, aA14};
      return ((TBinder<N, RetType, T, BindList>*)this)->CallByTuple(placeholderListTuple);
    }
  
    };




    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<0, RetType, T, BindList>
      : public TBinderBase<0, RetType, T, BindList>
      {
      T iTarget;

	TBinder(const T& aTarget) : iTarget(aTarget) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget();
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<1, RetType, T, BindList>
      : public TBinderBase<1, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0) : iTarget(aTarget), iB0(aB0) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<2, RetType, T, BindList>
      : public TBinderBase<2, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1) : iTarget(aTarget), iB0(aB0), iB1(aB1) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<3, RetType, T, BindList>
      : public TBinderBase<3, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<4, RetType, T, BindList>
      : public TBinderBase<4, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<5, RetType, T, BindList>
      : public TBinderBase<5, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<6, RetType, T, BindList>
      : public TBinderBase<6, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<7, RetType, T, BindList>
      : public TBinderBase<7, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<8, RetType, T, BindList>
      : public TBinderBase<8, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<9, RetType, T, BindList>
      : public TBinderBase<9, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;
   typename TBinderField< typename TListGet<8, BindList>::type >::type iB8;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7, typename TListGet<8, BindList>::type aB8) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7), iB8(aB8) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple), ApplyPlaceholder(iB8, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<10, RetType, T, BindList>
      : public TBinderBase<10, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;
   typename TBinderField< typename TListGet<8, BindList>::type >::type iB8;
   typename TBinderField< typename TListGet<9, BindList>::type >::type iB9;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7, typename TListGet<8, BindList>::type aB8, typename TListGet<9, BindList>::type aB9) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7), iB8(aB8), iB9(aB9) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple), ApplyPlaceholder(iB8, aPlaceholderListTuple), ApplyPlaceholder(iB9, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<11, RetType, T, BindList>
      : public TBinderBase<11, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;
   typename TBinderField< typename TListGet<8, BindList>::type >::type iB8;
   typename TBinderField< typename TListGet<9, BindList>::type >::type iB9;
   typename TBinderField< typename TListGet<10, BindList>::type >::type iB10;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7, typename TListGet<8, BindList>::type aB8, typename TListGet<9, BindList>::type aB9, typename TListGet<10, BindList>::type aB10) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7), iB8(aB8), iB9(aB9), iB10(aB10) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple), ApplyPlaceholder(iB8, aPlaceholderListTuple), ApplyPlaceholder(iB9, aPlaceholderListTuple), ApplyPlaceholder(iB10, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<12, RetType, T, BindList>
      : public TBinderBase<12, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;
   typename TBinderField< typename TListGet<8, BindList>::type >::type iB8;
   typename TBinderField< typename TListGet<9, BindList>::type >::type iB9;
   typename TBinderField< typename TListGet<10, BindList>::type >::type iB10;
   typename TBinderField< typename TListGet<11, BindList>::type >::type iB11;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7, typename TListGet<8, BindList>::type aB8, typename TListGet<9, BindList>::type aB9, typename TListGet<10, BindList>::type aB10, typename TListGet<11, BindList>::type aB11) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7), iB8(aB8), iB9(aB9), iB10(aB10), iB11(aB11) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple), ApplyPlaceholder(iB8, aPlaceholderListTuple), ApplyPlaceholder(iB9, aPlaceholderListTuple), ApplyPlaceholder(iB10, aPlaceholderListTuple), ApplyPlaceholder(iB11, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<13, RetType, T, BindList>
      : public TBinderBase<13, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;
   typename TBinderField< typename TListGet<8, BindList>::type >::type iB8;
   typename TBinderField< typename TListGet<9, BindList>::type >::type iB9;
   typename TBinderField< typename TListGet<10, BindList>::type >::type iB10;
   typename TBinderField< typename TListGet<11, BindList>::type >::type iB11;
   typename TBinderField< typename TListGet<12, BindList>::type >::type iB12;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7, typename TListGet<8, BindList>::type aB8, typename TListGet<9, BindList>::type aB9, typename TListGet<10, BindList>::type aB10, typename TListGet<11, BindList>::type aB11, typename TListGet<12, BindList>::type aB12) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7), iB8(aB8), iB9(aB9), iB10(aB10), iB11(aB11), iB12(aB12) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple), ApplyPlaceholder(iB8, aPlaceholderListTuple), ApplyPlaceholder(iB9, aPlaceholderListTuple), ApplyPlaceholder(iB10, aPlaceholderListTuple), ApplyPlaceholder(iB11, aPlaceholderListTuple), ApplyPlaceholder(iB12, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<14, RetType, T, BindList>
      : public TBinderBase<14, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;
   typename TBinderField< typename TListGet<8, BindList>::type >::type iB8;
   typename TBinderField< typename TListGet<9, BindList>::type >::type iB9;
   typename TBinderField< typename TListGet<10, BindList>::type >::type iB10;
   typename TBinderField< typename TListGet<11, BindList>::type >::type iB11;
   typename TBinderField< typename TListGet<12, BindList>::type >::type iB12;
   typename TBinderField< typename TListGet<13, BindList>::type >::type iB13;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7, typename TListGet<8, BindList>::type aB8, typename TListGet<9, BindList>::type aB9, typename TListGet<10, BindList>::type aB10, typename TListGet<11, BindList>::type aB11, typename TListGet<12, BindList>::type aB12, typename TListGet<13, BindList>::type aB13) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7), iB8(aB8), iB9(aB9), iB10(aB10), iB11(aB11), iB12(aB12), iB13(aB13) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple), ApplyPlaceholder(iB8, aPlaceholderListTuple), ApplyPlaceholder(iB9, aPlaceholderListTuple), ApplyPlaceholder(iB10, aPlaceholderListTuple), ApplyPlaceholder(iB11, aPlaceholderListTuple), ApplyPlaceholder(iB12, aPlaceholderListTuple), ApplyPlaceholder(iB13, aPlaceholderListTuple));
    }

      };


    
      
      template<typename RetType, typename T, typename BindList>
      struct TBinder<15, RetType, T, BindList>
      : public TBinderBase<15, RetType, T, BindList>
      {
      T iTarget;
   typename TBinderField< typename TListGet<0, BindList>::type >::type iB0;
   typename TBinderField< typename TListGet<1, BindList>::type >::type iB1;
   typename TBinderField< typename TListGet<2, BindList>::type >::type iB2;
   typename TBinderField< typename TListGet<3, BindList>::type >::type iB3;
   typename TBinderField< typename TListGet<4, BindList>::type >::type iB4;
   typename TBinderField< typename TListGet<5, BindList>::type >::type iB5;
   typename TBinderField< typename TListGet<6, BindList>::type >::type iB6;
   typename TBinderField< typename TListGet<7, BindList>::type >::type iB7;
   typename TBinderField< typename TListGet<8, BindList>::type >::type iB8;
   typename TBinderField< typename TListGet<9, BindList>::type >::type iB9;
   typename TBinderField< typename TListGet<10, BindList>::type >::type iB10;
   typename TBinderField< typename TListGet<11, BindList>::type >::type iB11;
   typename TBinderField< typename TListGet<12, BindList>::type >::type iB12;
   typename TBinderField< typename TListGet<13, BindList>::type >::type iB13;
   typename TBinderField< typename TListGet<14, BindList>::type >::type iB14;

	TBinder(const T& aTarget, typename TListGet<0, BindList>::type aB0, typename TListGet<1, BindList>::type aB1, typename TListGet<2, BindList>::type aB2, typename TListGet<3, BindList>::type aB3, typename TListGet<4, BindList>::type aB4, typename TListGet<5, BindList>::type aB5, typename TListGet<6, BindList>::type aB6, typename TListGet<7, BindList>::type aB7, typename TListGet<8, BindList>::type aB8, typename TListGet<9, BindList>::type aB9, typename TListGet<10, BindList>::type aB10, typename TListGet<11, BindList>::type aB11, typename TListGet<12, BindList>::type aB12, typename TListGet<13, BindList>::type aB13, typename TListGet<14, BindList>::type aB14) : iTarget(aTarget), iB0(aB0), iB1(aB1), iB2(aB2), iB3(aB3), iB4(aB4), iB5(aB5), iB6(aB6), iB7(aB7), iB8(aB8), iB9(aB9), iB10(aB10), iB11(aB11), iB12(aB12), iB13(aB13), iB14(aB14) {}
    template<typename TT>
      RetType CallByTuple(TT& aPlaceholderListTuple)
      {
      return iTarget(ApplyPlaceholder(iB0, aPlaceholderListTuple), ApplyPlaceholder(iB1, aPlaceholderListTuple), ApplyPlaceholder(iB2, aPlaceholderListTuple), ApplyPlaceholder(iB3, aPlaceholderListTuple), ApplyPlaceholder(iB4, aPlaceholderListTuple), ApplyPlaceholder(iB5, aPlaceholderListTuple), ApplyPlaceholder(iB6, aPlaceholderListTuple), ApplyPlaceholder(iB7, aPlaceholderListTuple), ApplyPlaceholder(iB8, aPlaceholderListTuple), ApplyPlaceholder(iB9, aPlaceholderListTuple), ApplyPlaceholder(iB10, aPlaceholderListTuple), ApplyPlaceholder(iB11, aPlaceholderListTuple), ApplyPlaceholder(iB12, aPlaceholderListTuple), ApplyPlaceholder(iB13, aPlaceholderListTuple), ApplyPlaceholder(iB14, aPlaceholderListTuple));
    }

      };


    

    template<typename RetType, typename A0, typename B0>
    TBinder<1, RetType, RetType(*) (A0), typename TList1<B0>::type >
    Bind(RetType(*aTarget) (A0), B0 aB0)
    {
      return 
    TBinder<1, RetType, RetType(*) (A0), typename TList1<B0>::type >
    (aTarget, aB0);
    }
    
    
    template<typename RetType, typename T>
    struct TMemFun1
    {
    RetType (T::*iMemFun)();
    TMemFun1(RetType (T::*aMemFun)() ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT)
    {
    return (aT->*iMemFun)();
    }
    RetType operator()(T& aT)
    {
    return (aT.*iMemFun)();
    }
    };
    
    template<typename RetType, typename T, typename B0>
    TBinder<1, RetType, TMemFun1<RetType, T>, typename TList1<B0>::type >
    Bind(RetType(T::*aTarget) (), B0 aB0)
    {
      return 
    TBinder<1, RetType, TMemFun1<RetType, T>, typename TList1<B0>::type >
    (TMemFun1<RetType, T>(aTarget), aB0);
    }


  

    template<typename RetType, typename A0, typename A1, typename B0, typename B1>
    TBinder<2, RetType, RetType(*) (A0, A1), typename TList2<B0, B1>::type >
    Bind(RetType(*aTarget) (A0, A1), B0 aB0, B1 aB1)
    {
      return 
    TBinder<2, RetType, RetType(*) (A0, A1), typename TList2<B0, B1>::type >
    (aTarget, aB0, aB1);
    }
    
    
    template<typename RetType, typename T, typename A1>
    struct TMemFun2
    {
    RetType (T::*iMemFun)(A1);
    TMemFun2(RetType (T::*aMemFun)(A1) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1)
    {
    return (aT->*iMemFun)(aA1);
    }
    RetType operator()(T& aT, A1 aA1)
    {
    return (aT.*iMemFun)(aA1);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename B0, typename B1>
    TBinder<2, RetType, TMemFun2<RetType, T, A1>, typename TList2<B0, B1>::type >
    Bind(RetType(T::*aTarget) (A1), B0 aB0, B1 aB1)
    {
      return 
    TBinder<2, RetType, TMemFun2<RetType, T, A1>, typename TList2<B0, B1>::type >
    (TMemFun2<RetType, T, A1>(aTarget), aB0, aB1);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename B0, typename B1, typename B2>
    TBinder<3, RetType, RetType(*) (A0, A1, A2), typename TList3<B0, B1, B2>::type >
    Bind(RetType(*aTarget) (A0, A1, A2), B0 aB0, B1 aB1, B2 aB2)
    {
      return 
    TBinder<3, RetType, RetType(*) (A0, A1, A2), typename TList3<B0, B1, B2>::type >
    (aTarget, aB0, aB1, aB2);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2>
    struct TMemFun3
    {
    RetType (T::*iMemFun)(A1, A2);
    TMemFun3(RetType (T::*aMemFun)(A1, A2) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2)
    {
    return (aT->*iMemFun)(aA1, aA2);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2)
    {
    return (aT.*iMemFun)(aA1, aA2);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename B0, typename B1, typename B2>
    TBinder<3, RetType, TMemFun3<RetType, T, A1, A2>, typename TList3<B0, B1, B2>::type >
    Bind(RetType(T::*aTarget) (A1, A2), B0 aB0, B1 aB1, B2 aB2)
    {
      return 
    TBinder<3, RetType, TMemFun3<RetType, T, A1, A2>, typename TList3<B0, B1, B2>::type >
    (TMemFun3<RetType, T, A1, A2>(aTarget), aB0, aB1, aB2);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename B0, typename B1, typename B2, typename B3>
    TBinder<4, RetType, RetType(*) (A0, A1, A2, A3), typename TList4<B0, B1, B2, B3>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3), B0 aB0, B1 aB1, B2 aB2, B3 aB3)
    {
      return 
    TBinder<4, RetType, RetType(*) (A0, A1, A2, A3), typename TList4<B0, B1, B2, B3>::type >
    (aTarget, aB0, aB1, aB2, aB3);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3>
    struct TMemFun4
    {
    RetType (T::*iMemFun)(A1, A2, A3);
    TMemFun4(RetType (T::*aMemFun)(A1, A2, A3) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename B0, typename B1, typename B2, typename B3>
    TBinder<4, RetType, TMemFun4<RetType, T, A1, A2, A3>, typename TList4<B0, B1, B2, B3>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3), B0 aB0, B1 aB1, B2 aB2, B3 aB3)
    {
      return 
    TBinder<4, RetType, TMemFun4<RetType, T, A1, A2, A3>, typename TList4<B0, B1, B2, B3>::type >
    (TMemFun4<RetType, T, A1, A2, A3>(aTarget), aB0, aB1, aB2, aB3);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename B0, typename B1, typename B2, typename B3, typename B4>
    TBinder<5, RetType, RetType(*) (A0, A1, A2, A3, A4), typename TList5<B0, B1, B2, B3, B4>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4)
    {
      return 
    TBinder<5, RetType, RetType(*) (A0, A1, A2, A3, A4), typename TList5<B0, B1, B2, B3, B4>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4>
    struct TMemFun5
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4);
    TMemFun5(RetType (T::*aMemFun)(A1, A2, A3, A4) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename B0, typename B1, typename B2, typename B3, typename B4>
    TBinder<5, RetType, TMemFun5<RetType, T, A1, A2, A3, A4>, typename TList5<B0, B1, B2, B3, B4>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4)
    {
      return 
    TBinder<5, RetType, TMemFun5<RetType, T, A1, A2, A3, A4>, typename TList5<B0, B1, B2, B3, B4>::type >
    (TMemFun5<RetType, T, A1, A2, A3, A4>(aTarget), aB0, aB1, aB2, aB3, aB4);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5>
    TBinder<6, RetType, RetType(*) (A0, A1, A2, A3, A4, A5), typename TList6<B0, B1, B2, B3, B4, B5>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5)
    {
      return 
    TBinder<6, RetType, RetType(*) (A0, A1, A2, A3, A4, A5), typename TList6<B0, B1, B2, B3, B4, B5>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5>
    struct TMemFun6
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5);
    TMemFun6(RetType (T::*aMemFun)(A1, A2, A3, A4, A5) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5>
    TBinder<6, RetType, TMemFun6<RetType, T, A1, A2, A3, A4, A5>, typename TList6<B0, B1, B2, B3, B4, B5>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5)
    {
      return 
    TBinder<6, RetType, TMemFun6<RetType, T, A1, A2, A3, A4, A5>, typename TList6<B0, B1, B2, B3, B4, B5>::type >
    (TMemFun6<RetType, T, A1, A2, A3, A4, A5>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6>
    TBinder<7, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6), typename TList7<B0, B1, B2, B3, B4, B5, B6>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6)
    {
      return 
    TBinder<7, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6), typename TList7<B0, B1, B2, B3, B4, B5, B6>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6>
    struct TMemFun7
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6);
    TMemFun7(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6>
    TBinder<7, RetType, TMemFun7<RetType, T, A1, A2, A3, A4, A5, A6>, typename TList7<B0, B1, B2, B3, B4, B5, B6>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6)
    {
      return 
    TBinder<7, RetType, TMemFun7<RetType, T, A1, A2, A3, A4, A5, A6>, typename TList7<B0, B1, B2, B3, B4, B5, B6>::type >
    (TMemFun7<RetType, T, A1, A2, A3, A4, A5, A6>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7>
    TBinder<8, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7), typename TList8<B0, B1, B2, B3, B4, B5, B6, B7>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7)
    {
      return 
    TBinder<8, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7), typename TList8<B0, B1, B2, B3, B4, B5, B6, B7>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7>
    struct TMemFun8
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7);
    TMemFun8(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7>
    TBinder<8, RetType, TMemFun8<RetType, T, A1, A2, A3, A4, A5, A6, A7>, typename TList8<B0, B1, B2, B3, B4, B5, B6, B7>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7)
    {
      return 
    TBinder<8, RetType, TMemFun8<RetType, T, A1, A2, A3, A4, A5, A6, A7>, typename TList8<B0, B1, B2, B3, B4, B5, B6, B7>::type >
    (TMemFun8<RetType, T, A1, A2, A3, A4, A5, A6, A7>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8>
    TBinder<9, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8), typename TList9<B0, B1, B2, B3, B4, B5, B6, B7, B8>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7, A8), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8)
    {
      return 
    TBinder<9, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8), typename TList9<B0, B1, B2, B3, B4, B5, B6, B7, B8>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8>
    struct TMemFun9
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7, A8);
    TMemFun9(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7, A8) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8>
    TBinder<9, RetType, TMemFun9<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8>, typename TList9<B0, B1, B2, B3, B4, B5, B6, B7, B8>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7, A8), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8)
    {
      return 
    TBinder<9, RetType, TMemFun9<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8>, typename TList9<B0, B1, B2, B3, B4, B5, B6, B7, B8>::type >
    (TMemFun9<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9>
    TBinder<10, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9), typename TList10<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9)
    {
      return 
    TBinder<10, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9), typename TList10<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9>
    struct TMemFun10
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9);
    TMemFun10(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9>
    TBinder<10, RetType, TMemFun10<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9>, typename TList10<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7, A8, A9), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9)
    {
      return 
    TBinder<10, RetType, TMemFun10<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9>, typename TList10<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9>::type >
    (TMemFun10<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10>
    TBinder<11, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), typename TList11<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10)
    {
      return 
    TBinder<11, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), typename TList11<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10>
    struct TMemFun11
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10);
    TMemFun11(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10>
    TBinder<11, RetType, TMemFun11<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, typename TList11<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10)
    {
      return 
    TBinder<11, RetType, TMemFun11<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>, typename TList11<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10>::type >
    (TMemFun11<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11>
    TBinder<12, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11), typename TList12<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11)
    {
      return 
    TBinder<12, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11), typename TList12<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11>
    struct TMemFun12
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11);
    TMemFun12(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11>
    TBinder<12, RetType, TMemFun12<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, typename TList12<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11)
    {
      return 
    TBinder<12, RetType, TMemFun12<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>, typename TList12<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11>::type >
    (TMemFun12<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11, typename B12>
    TBinder<13, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12), typename TList13<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11, B12 aB12)
    {
      return 
    TBinder<13, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12), typename TList13<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11, aB12);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12>
    struct TMemFun13
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12);
    TMemFun13(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11, A12 aA12)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11, A12 aA12)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11, typename B12>
    TBinder<13, RetType, TMemFun13<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, typename TList13<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11, B12 aB12)
    {
      return 
    TBinder<13, RetType, TMemFun13<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>, typename TList13<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12>::type >
    (TMemFun13<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11, aB12);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11, typename B12, typename B13>
    TBinder<14, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13), typename TList14<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11, B12 aB12, B13 aB13)
    {
      return 
    TBinder<14, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13), typename TList14<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11, aB12, aB13);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13>
    struct TMemFun14
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13);
    TMemFun14(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11, A12 aA12, A13 aA13)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12, aA13);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11, A12 aA12, A13 aA13)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12, aA13);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11, typename B12, typename B13>
    TBinder<14, RetType, TMemFun14<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, typename TList14<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11, B12 aB12, B13 aB13)
    {
      return 
    TBinder<14, RetType, TMemFun14<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>, typename TList14<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13>::type >
    (TMemFun14<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11, aB12, aB13);
    }


  

    template<typename RetType, typename A0, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11, typename B12, typename B13, typename B14>
    TBinder<15, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14), typename TList15<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14>::type >
    Bind(RetType(*aTarget) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11, B12 aB12, B13 aB13, B14 aB14)
    {
      return 
    TBinder<15, RetType, RetType(*) (A0, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14), typename TList15<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14>::type >
    (aTarget, aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11, aB12, aB13, aB14);
    }
    
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14>
    struct TMemFun15
    {
    RetType (T::*iMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14);
    TMemFun15(RetType (T::*aMemFun)(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14) ) : iMemFun(aMemFun) { }
    RetType operator()(T* aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11, A12 aA12, A13 aA13, A14 aA14)
    {
    return (aT->*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12, aA13, aA14);
    }
    RetType operator()(T& aT, A1 aA1, A2 aA2, A3 aA3, A4 aA4, A5 aA5, A6 aA6, A7 aA7, A8 aA8, A9 aA9, A10 aA10, A11 aA11, A12 aA12, A13 aA13, A14 aA14)
    {
    return (aT.*iMemFun)(aA1, aA2, aA3, aA4, aA5, aA6, aA7, aA8, aA9, aA10, aA11, aA12, aA13, aA14);
    }
    };
    
    template<typename RetType, typename T, typename A1, typename A2, typename A3, typename A4, typename A5, typename A6, typename A7, typename A8, typename A9, typename A10, typename A11, typename A12, typename A13, typename A14, typename B0, typename B1, typename B2, typename B3, typename B4, typename B5, typename B6, typename B7, typename B8, typename B9, typename B10, typename B11, typename B12, typename B13, typename B14>
    TBinder<15, RetType, TMemFun15<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, typename TList15<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14>::type >
    Bind(RetType(T::*aTarget) (A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14), B0 aB0, B1 aB1, B2 aB2, B3 aB3, B4 aB4, B5 aB5, B6 aB6, B7 aB7, B8 aB8, B9 aB9, B10 aB10, B11 aB11, B12 aB12, B13 aB13, B14 aB14)
    {
      return 
    TBinder<15, RetType, TMemFun15<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>, typename TList15<B0, B1, B2, B3, B4, B5, B6, B7, B8, B9, B10, B11, B12, B13, B14>::type >
    (TMemFun15<RetType, T, A1, A2, A3, A4, A5, A6, A7, A8, A9, A10, A11, A12, A13, A14>(aTarget), aB0, aB1, aB2, aB3, aB4, aB5, aB6, aB7, aB8, aB9, aB10, aB11, aB12, aB13, aB14);
    }


  
